package com.tcs.test.single.singletions;

/**
 * 懒汉模式, 双重效验锁 <br>
 * 1. 此处涉及Java的指令重排优化。指令重排优化是指在不改变原语义的情况下，通过调整指令的执行顺序让程序运行地更快。 <br>
 * 2. JVM中没有规定编译器优化的相关内容，也即JVM可以自由地进行指令重排序的优化。<br>
 * 3. 此问题的关键在于由于指令重排序优化的存在，导致初始化Singleton和将对象地址赋给instance字段的顺序是不确定的。<br>
 * 4. 在某个线程创建单例对象时，在构造函数被调用前，就为该对象分配了内存空间并将对象的字段设置为默认值。
 * 此时就可以将分配的内存地址赋值给instance字段了，然而该对象可能还没初始化。若紧接着另一个线程来调用getInstance，
 * 获取到的就是状态不正确的对象，程序出错。
 */
public class Singletion5 {

    private static volatile Singletion5 singletion1 = null;

    private Singletion5() {
        System.out.println(" 懒汉模式,线程安全 ");
    }

    public static Singletion5 getSingletion1() {
        if (singletion1 == null) {
            synchronized (Singletion5.class) {
                if (singletion1 == null) {
                    singletion1 = new Singletion5();
                }
            }
        }
        return singletion1;
    }
}
